import model.Move;
import model.Tank;
import model.TankType;
import model.World;

/**
 * Стратегия --- интерфейс, содержащий описание методов искусственного интеллекта танка.
 * Каждая пользовательская стратегия должна реализовывать этот интерфейс.
 * Может отсутствовать в некоторых языковых пакетах, если язык не поддерживает интерфейсы.
 */
public interface Strategy {
    /**
     * Основной метод стратегии, осуществляющий управление танком. Вызывается каждый тик для каждого танка.
     *
     * @param self Танк, которым данный метод будет осуществлять управление.
     * @param world Текущее состояние мира.
     * @param move Результатом работы метода является изменение полей данного объекта.
     */
    void move(Tank self, World world, Move move);

    /**
     * Позволяет выбрать тип танка. Вызывается один раз для каждого танка до начала отсчёта игрового времени.
     *
     * @param tankIndex 0-индексированный номер танка в команде.
     * @param teamSize Размер команды.
     * @return Возвращает выбранный тип танка.
     */
    TankType selectTank(int tankIndex, int teamSize);
}
